home *** CD-ROM | disk | FTP | other *** search
- package java.io;
-
- import java.security.AccessController;
- import java.util.Locale;
- import sun.security.action.GetPropertyAction;
-
- class Win32FileSystem extends FileSystem {
- private final char slash = ((String)AccessController.doPrivileged(new GetPropertyAction("file.separator"))).charAt(0);
- private final char altSlash;
- private final char semicolon = ((String)AccessController.doPrivileged(new GetPropertyAction("path.separator"))).charAt(0);
- private static String[] driveDirCache = new String[26];
- private ExpiringCache cache = new ExpiringCache();
- private ExpiringCache prefixCache = new ExpiringCache();
-
- public Win32FileSystem() {
- this.altSlash = (char)(this.slash == '\\' ? 47 : 92);
- }
-
- private boolean isSlash(char var1) {
- return var1 == '\\' || var1 == '/';
- }
-
- private boolean isLetter(char var1) {
- return var1 >= 'a' && var1 <= 'z' || var1 >= 'A' && var1 <= 'Z';
- }
-
- private String slashify(String var1) {
- return var1.length() > 0 && var1.charAt(0) != this.slash ? this.slash + var1 : var1;
- }
-
- public char getSeparator() {
- return this.slash;
- }
-
- public char getPathSeparator() {
- return this.semicolon;
- }
-
- private int normalizePrefix(String var1, int var2, StringBuffer var3) {
- int var4;
- for(var4 = 0; var4 < var2 && this.isSlash(var1.charAt(var4)); ++var4) {
- }
-
- char var5;
- if (var2 - var4 >= 2 && this.isLetter(var5 = var1.charAt(var4)) && var1.charAt(var4 + 1) == ':') {
- var3.append(var5);
- var3.append(':');
- var4 += 2;
- } else {
- var4 = 0;
- if (var2 >= 2 && this.isSlash(var1.charAt(0)) && this.isSlash(var1.charAt(1))) {
- var4 = 1;
- var3.append(this.slash);
- }
- }
-
- return var4;
- }
-
- private String normalize(String var1, int var2, int var3) {
- if (var2 == 0) {
- return var1;
- } else {
- if (var3 < 3) {
- var3 = 0;
- }
-
- char var5 = this.slash;
- StringBuffer var6 = new StringBuffer(var2);
- int var4;
- if (var3 == 0) {
- var4 = this.normalizePrefix(var1, var2, var6);
- } else {
- var4 = var3;
- var6.append(var1.substring(0, var3));
- }
-
- while(var4 < var2) {
- char var7 = var1.charAt(var4++);
- if (!this.isSlash(var7)) {
- var6.append(var7);
- } else {
- while(var4 < var2 && this.isSlash(var1.charAt(var4))) {
- ++var4;
- }
-
- if (var4 == var2) {
- int var8 = var6.length();
- if (var8 == 2 && var6.charAt(1) == ':') {
- var6.append(var5);
- } else if (var8 == 0) {
- var6.append(var5);
- } else if (var8 == 1 && this.isSlash(var6.charAt(0))) {
- var6.append(var5);
- }
- break;
- }
-
- var6.append(var5);
- }
- }
-
- String var9 = var6.toString();
- return var9;
- }
- }
-
- public String normalize(String var1) {
- int var2 = var1.length();
- char var3 = this.slash;
- char var4 = this.altSlash;
- char var5 = 0;
-
- for(int var6 = 0; var6 < var2; ++var6) {
- char var7 = var1.charAt(var6);
- if (var7 == var4) {
- return this.normalize(var1, var2, var5 == var3 ? var6 - 1 : var6);
- }
-
- if (var7 == var3 && var5 == var3 && var6 > 1) {
- return this.normalize(var1, var2, var6 - 1);
- }
-
- if (var7 == ':' && var6 > 1) {
- return this.normalize(var1, var2, 0);
- }
-
- var5 = var7;
- }
-
- if (var5 == var3) {
- return this.normalize(var1, var2, var2 - 1);
- } else {
- return var1;
- }
- }
-
- public int prefixLength(String var1) {
- char var2 = this.slash;
- int var3 = var1.length();
- if (var3 == 0) {
- return 0;
- } else {
- char var4 = var1.charAt(0);
- char var5 = var3 > 1 ? var1.charAt(1) : 0;
- if (var4 == var2) {
- return var5 == var2 ? 2 : 1;
- } else if (this.isLetter(var4) && var5 == ':') {
- return var3 > 2 && var1.charAt(2) == var2 ? 3 : 2;
- } else {
- return 0;
- }
- }
- }
-
- public String resolve(String var1, String var2) {
- int var3 = var1.length();
- if (var3 == 0) {
- return var2;
- } else {
- int var4 = var2.length();
- if (var4 == 0) {
- return var1;
- } else {
- byte var6 = 0;
- int var7 = var3;
- if (var4 > 1 && var2.charAt(0) == this.slash) {
- if (var2.charAt(1) == this.slash) {
- var6 = 2;
- } else {
- var6 = 1;
- }
-
- if (var4 == var6) {
- if (var1.charAt(var3 - 1) == this.slash) {
- return var1.substring(0, var3 - 1);
- }
-
- return var1;
- }
- }
-
- if (var1.charAt(var3 - 1) == this.slash) {
- var7 = var3 - 1;
- }
-
- int var8 = var7 + var4 - var6;
- Object var9 = null;
- char[] var10;
- if (var2.charAt(var6) == this.slash) {
- var10 = new char[var8];
- var1.getChars(0, var7, var10, 0);
- var2.getChars(var6, var4, var10, var7);
- } else {
- var10 = new char[var8 + 1];
- var1.getChars(0, var7, var10, 0);
- var10[var7] = this.slash;
- var2.getChars(var6, var4, var10, var7 + 1);
- }
-
- return new String(var10);
- }
- }
- }
-
- public String getDefaultParent() {
- return "" + this.slash;
- }
-
- public String fromURIPath(String var1) {
- String var2 = var1;
- if (var1.length() > 2 && var1.charAt(2) == ':') {
- var2 = var1.substring(1);
- if (var2.length() > 3 && var2.endsWith("/")) {
- var2 = var2.substring(0, var2.length() - 1);
- }
- } else if (var1.length() > 1 && var1.endsWith("/")) {
- var2 = var1.substring(0, var1.length() - 1);
- }
-
- return var2;
- }
-
- public boolean isAbsolute(File var1) {
- int var2 = var1.getPrefixLength();
- return var2 == 2 && var1.getPath().charAt(0) == this.slash || var2 == 3;
- }
-
- protected native String getDriveDirectory(int var1);
-
- private static int driveIndex(char var0) {
- if (var0 >= 'a' && var0 <= 'z') {
- return var0 - 97;
- } else {
- return var0 >= 'A' && var0 <= 'Z' ? var0 - 65 : -1;
- }
- }
-
- private String getDriveDirectory(char var1) {
- int var2 = driveIndex(var1);
- if (var2 < 0) {
- return null;
- } else {
- String var3 = driveDirCache[var2];
- if (var3 != null) {
- return var3;
- } else {
- var3 = this.getDriveDirectory(var2 + 1);
- driveDirCache[var2] = var3;
- return var3;
- }
- }
- }
-
- private String getUserPath() {
- return this.normalize(System.getProperty("user.dir"));
- }
-
- private String getDrive(String var1) {
- int var2 = this.prefixLength(var1);
- return var2 == 3 ? var1.substring(0, 2) : null;
- }
-
- public String resolve(File var1) {
- String var2 = var1.getPath();
- int var3 = var1.getPrefixLength();
- if (var3 == 2 && var2.charAt(0) == this.slash) {
- return var2;
- } else if (var3 == 3) {
- return var2;
- } else if (var3 == 0) {
- return this.getUserPath() + this.slashify(var2);
- } else if (var3 == 1) {
- String var13 = this.getUserPath();
- String var14 = this.getDrive(var13);
- return var14 != null ? var14 + var2 : var13 + var2;
- } else if (var3 == 2) {
- String var4 = this.getUserPath();
- String var5 = this.getDrive(var4);
- if (var5 != null && var2.startsWith(var5)) {
- return var4 + this.slashify(var2.substring(2));
- } else {
- char var6 = var2.charAt(0);
- String var7 = this.getDriveDirectory(var6);
- if (var7 != null) {
- String var9 = "" + var6 + ':' + var7 + this.slashify(var2.substring(2));
- SecurityManager var10 = System.getSecurityManager();
-
- try {
- if (var10 != null) {
- var10.checkRead(var9);
- }
-
- return var9;
- } catch (SecurityException var12) {
- throw new SecurityException("Cannot resolve path " + var2);
- }
- } else {
- return var6 + ":" + this.slashify(var2.substring(2));
- }
- }
- } else {
- throw new InternalError("Unresolvable path: " + var2);
- }
- }
-
- public String canonicalize(String var1) throws IOException {
- int var2 = var1.length();
- if (var2 == 2 && this.isLetter(var1.charAt(0)) && var1.charAt(1) == ':') {
- char var8 = var1.charAt(0);
- return var8 >= 'A' && var8 <= 'Z' ? var1 : "" + (char)(var8 - 32) + ':';
- } else if (var2 == 3 && this.isLetter(var1.charAt(0)) && var1.charAt(1) == ':' && var1.charAt(2) == '\\') {
- char var7 = var1.charAt(0);
- return var7 >= 'A' && var7 <= 'Z' ? var1 : "" + (char)(var7 - 32) + ':' + '\\';
- } else if (!useCanonCaches) {
- return this.canonicalize0(var1);
- } else {
- String var3 = this.cache.get(var1);
- if (var3 == null) {
- String var4 = null;
- Object var5 = null;
- if (useCanonPrefixCache) {
- var4 = parentOrNull(var1);
- if (var4 != null) {
- String var9 = this.prefixCache.get(var4);
- if (var9 != null) {
- String var6 = var1.substring(1 + var4.length());
- var3 = this.canonicalizeWithPrefix(var9, var6);
- this.cache.put(var4 + File.separatorChar + var6, var3);
- }
- }
- }
-
- if (var3 == null) {
- var3 = this.canonicalize0(var1);
- this.cache.put(var1, var3);
- if (useCanonPrefixCache && var4 != null) {
- String var10 = parentOrNull(var3);
- if (var10 != null) {
- File var11 = new File(var3);
- if (var11.exists() && !var11.isDirectory()) {
- this.prefixCache.put(var4, var10);
- }
- }
- }
- }
- }
-
- assert this.canonicalize0(var1).equalsIgnoreCase(var3);
-
- return var3;
- }
- }
-
- protected native String canonicalize0(String var1) throws IOException;
-
- protected String canonicalizeWithPrefix(String var1, String var2) throws IOException {
- return this.canonicalizeWithPrefix0(var1, var1 + File.separatorChar + var2);
- }
-
- protected native String canonicalizeWithPrefix0(String var1, String var2) throws IOException;
-
- static String parentOrNull(String var0) {
- if (var0 == null) {
- return null;
- } else {
- char var1 = File.separatorChar;
- byte var2 = 47;
- int var3 = var0.length() - 1;
- int var4 = var3;
- int var5 = 0;
-
- for(int var6 = 0; var4 > 0; --var4) {
- char var7 = var0.charAt(var4);
- if (var7 == '.') {
- ++var5;
- if (var5 >= 2) {
- return null;
- }
-
- if (var6 == 0) {
- return null;
- }
- } else {
- if (var7 == var1) {
- if (var5 == 1 && var6 == 0) {
- return null;
- }
-
- if (var4 != 0 && var4 < var3 - 1 && var0.charAt(var4 - 1) != var1 && var0.charAt(var4 - 1) != var2) {
- return var0.substring(0, var4);
- }
-
- return null;
- }
-
- if (var7 == var2) {
- return null;
- }
-
- if (var7 == '*' || var7 == '?') {
- return null;
- }
-
- ++var6;
- var5 = 0;
- }
- }
-
- return null;
- }
- }
-
- public native int getBooleanAttributes(File var1);
-
- public native boolean checkAccess(File var1, int var2);
-
- public native long getLastModifiedTime(File var1);
-
- public native long getLength(File var1);
-
- public native boolean setPermission(File var1, int var2, boolean var3, boolean var4);
-
- public native boolean createFileExclusively(String var1) throws IOException;
-
- public boolean delete(File var1) {
- this.cache.clear();
- this.prefixCache.clear();
- return this.delete0(var1);
- }
-
- protected native boolean delete0(File var1);
-
- public native String[] list(File var1);
-
- public native boolean createDirectory(File var1);
-
- public boolean rename(File var1, File var2) {
- this.cache.clear();
- this.prefixCache.clear();
- return this.rename0(var1, var2);
- }
-
- protected native boolean rename0(File var1, File var2);
-
- public native boolean setLastModifiedTime(File var1, long var2);
-
- public native boolean setReadOnly(File var1);
-
- private boolean access(String var1) {
- try {
- SecurityManager var2 = System.getSecurityManager();
- if (var2 != null) {
- var2.checkRead(var1);
- }
-
- return true;
- } catch (SecurityException var3) {
- return false;
- }
- }
-
- private static native int listRoots0();
-
- public File[] listRoots() {
- int var1 = listRoots0();
- int var2 = 0;
-
- for(int var3 = 0; var3 < 26; ++var3) {
- if ((var1 >> var3 & 1) != 0) {
- if (!this.access((char)(65 + var3) + ":" + this.slash)) {
- var1 &= ~(1 << var3);
- } else {
- ++var2;
- }
- }
- }
-
- File[] var7 = new File[var2];
- int var4 = 0;
- char var5 = this.slash;
-
- for(int var6 = 0; var6 < 26; ++var6) {
- if ((var1 >> var6 & 1) != 0) {
- var7[var4++] = new File((char)(65 + var6) + ":" + var5);
- }
- }
-
- return var7;
- }
-
- public long getSpace(File var1, int var2) {
- if (var1.exists()) {
- File var3 = var1.isDirectory() ? var1 : var1.getParentFile();
- return this.getSpace0(var3, var2);
- } else {
- return 0L;
- }
- }
-
- private native long getSpace0(File var1, int var2);
-
- public int compare(File var1, File var2) {
- return var1.getPath().compareToIgnoreCase(var2.getPath());
- }
-
- public int hashCode(File var1) {
- return var1.getPath().toLowerCase(Locale.ENGLISH).hashCode() ^ 1234321;
- }
-
- private static native void initIDs();
-
- static {
- initIDs();
- }
- }
-